'''
锦江WeHotel登录
网址：https://www.bestwehotel.com/NewLogin/?go=https%3A%2F%2Fwww.bestwehotel.com%2FAboutUs%2F

使用堆栈分析法
    当遇到如下代码块：就说明这是一个异步函数；此时堆栈分析的断点参数丢失！
        then: function(n) {
            var i = s();
            return t(function() {
                i.resolve(n(e))
            }),
            i.promise
        }
        解决方式：将断点打在 return t(function() {  这行上，重新刷新页面进入此断点

爬取分析：
    1.请求headers.rw 也需要 一个随机数t_random；
    2.请求参数 sw:md5加密生成，加密参数需要一个随机数 t_random；
    3.请求参数 password: AES加密生成；
    4.获取验证码图片；
    5.DdddOcr验证码识别，将内容赋值给 请求参数 verifyCode；
    6.发起登录请求；
'''

# 引入随机数库
import random
# random_number = random.random()  # 生成一个 [0,1) 之间的随机浮点数
# print(random_number)


# 引入md5加密库
import hashlib


def md5_encryption(data):
    '''MD5加密函数'''

    md5 = hashlib.md5()  # 创建一个md5对象
    md5.update(data.encode('utf-8'))  # 使用utf-8编码数据
    return md5.hexdigest()  # 返回加密后的十六进制字符串

# ## 使用函数
# data = "Mci2t32222222222295da52caf564f780c161ac380a3c9fdd"
# encrypted_data = md5_encryption(data)
# print(f"MD5 Encrypted: {encrypted_data}")


import execjs

# 编译JavaScript文件
with open('锦江WeHotel逆向登录+验证码.js', 'r') as f:
    js_content = f.read()
ctx = execjs.compile(js_content)

## 调用JavaScript中的getRandom函数
t_random = ctx.call('getRandom')
print(t_random)


import requests

cookies = {
    'gdp_user_id': 'fef0ee19-5780-4087-9f12-c014dcb754ea',
    'HWWAFSESTIME': '1727743378517',
    'HWWAFSESID': 'f94837c76edebd7093',
    'Hm_lvt_b6e767c4467dcad9be907eab9e9c78ac': '1727485925,1727526030,1727743384',
    'Hm_lpvt_b6e767c4467dcad9be907eab9e9c78ac': '1727743384',
    'HMACCOUNT': '826C05E635AD9D21',
    '989d198a589474f0_gdp_session_id': 'dbd7dae8-6477-4ab2-ac2f-0441e2258bc2',
    '989d198a589474f0_gdp_sequence_ids': '%7B%22globalKey%22%3A60%2C%22VISIT%22%3A5%2C%22PAGE%22%3A5%2C%22VIEW_CHANGE%22%3A32%2C%22VIEW_CLICK%22%3A21%7D',
    '989d198a589474f0_gdp_session_id_dbd7dae8-6477-4ab2-ac2f-0441e2258bc2': 'true',
}

headers = {
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Content-Type': 'application/json;charset=UTF-8',
    # 'Cookie': 'gdp_user_id=fef0ee19-5780-4087-9f12-c014dcb754ea; HWWAFSESTIME=1727743378517; HWWAFSESID=f94837c76edebd7093; Hm_lvt_b6e767c4467dcad9be907eab9e9c78ac=1727485925,1727526030,1727743384; Hm_lpvt_b6e767c4467dcad9be907eab9e9c78ac=1727743384; HMACCOUNT=826C05E635AD9D21; 989d198a589474f0_gdp_session_id=dbd7dae8-6477-4ab2-ac2f-0441e2258bc2; 989d198a589474f0_gdp_sequence_ids=%7B%22globalKey%22%3A60%2C%22VISIT%22%3A5%2C%22PAGE%22%3A5%2C%22VIEW_CHANGE%22%3A32%2C%22VIEW_CLICK%22%3A21%7D; 989d198a589474f0_gdp_session_id_dbd7dae8-6477-4ab2-ac2f-0441e2258bc2=true',
    'Origin': 'https://www.bestwehotel.com',
    'Pragma': 'no-cache',
    'Referer': 'https://www.bestwehotel.com/NewLogin/?go=https%3A%2F%2Fwww.bestwehotel.com%2FAboutUs%2F',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0',
    'X-WE-SDK': '1.5.5',
    # 'rw': 'voEfMH',
    'rw': t_random,
    'sec-ch-ua': '"Microsoft Edge";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
}

json_data = {
    'groupTypeId': 2,
    'type': 1,
    # 'mobile': '22222222222',  # 登录账号
    'mobile': '',  # 登录账号
    'password': '',  # 登录密码
    # 'password': 'sP+tbqkApteyCY61de8OFg==',  # 登录密码
    'rememberMe': False,
    'verifyCode': 'bbbb',  # 验证码
    'TDFingerprint': 'jWPHN1727749833K8G5Ub3GMt4',
    'blackBoxMd5': '41d57da4b22d2711f1703aa7df8be5e3',
    'did': '0b1c1a65b1701d3636b251ebac7106fa',
    'deviceInfo': {
        'fingerPrintJs': '95da52caf564f780c161ac380a3c9fdd',
        'userAgent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0',
        'platform': 'Win32',
    },
    'sw': '7d4ec1f13a5bb7fd1c4a46f5f5d91c44',  # 不一样
    'channelCode': 'CA00046',
}

## 使用录入的方式获取账号，密码
mobile = input('输入登录账号：')
password = input('输入登录密码：')
json_data['mobile'] = mobile
json_data['password'] = password



## 调用JavaScript中的l函数对password加密
pwd = ctx.call('l', json_data['password'])
print('密码加密：', pwd)


## 生成sw
# a.sw = hex_md5(t + a.mobile + a.deviceInfo.fingerPrintJs)
sw_param = t_random + json_data['mobile'] + json_data['deviceInfo']['fingerPrintJs']
# print(sw_param)
sw_val = md5_encryption(sw_param)
print('生成sw：', sw_val)


## 赋值
json_data['sw'] = sw_val
json_data['password'] = pwd
print('sw，pwd 赋值请求参数：', json_data)



img_param = {
    'mobile': mobile, # 手机号
    'verifyImageKey': random.random()
}
print('验证码请求参数：', img_param)
# 获取验证码图片
img_resp = requests.get(
    'https://www.bestwehotel.com/api/safeverify/getImageVerify',
    params=img_param,
    cookies=cookies,
    headers=headers,
)
## 检查请求是否成功
if img_resp.status_code == 200:
    # 以二进制写入模式打开文件
    with open('img1.jpg', 'wb') as f:
        # 写入二进制数据
        f.write(img_resp.content)
    print('图片下载成功！')
else:
    print('图片下载失败！')



# 使用ddddocr识别图片中的验证码
import ddddocr

ocr = ddddocr.DdddOcr()

image = open("img1.jpg", "rb").read()
result = ocr.classification(image)
print('识别验证码：',result)
json_data['verifyCode'] = result

print('最终请求参数：', json_data)

response = requests.post('https://www.bestwehotel.com/api/member/login'
                         , cookies=cookies
                         , headers=headers
                         , json=json_data)
print(response.json())
# 最终请求结果： {'code': '100008', 'success': False, 'message': '密码错误', 'data': None}
